package br.com.foxinline.manager.criar;

import br.com.foxinline.enums.Status;
import br.com.foxinline.enums.TipoDocumento;
import br.com.foxinline.enums.TipoRequerimento;
import br.com.foxinline.modelo.HistoricoRevisaoAlinhamento;
import br.com.foxinline.modelo.Imovel;
import br.com.foxinline.modelo.Proprietario;
import br.com.foxinline.modelo.Requerimento;
import br.com.foxinline.modelo.RevisaoAlinhamento;
import br.com.foxinline.modelo.TramiteRequerimento;
import br.com.foxinline.modelo.Usuario;
import br.com.foxinline.servico.ImovelServico;
import br.com.foxinline.servico.PrefeituraServico;
import br.com.foxinline.servico.RequerimentoServico;
import br.com.foxinline.servico.RevisaoAlinhamentoServico;
import br.com.foxinline.servico.TramiteRequerimentoServico;
import br.com.foxinline.servico.UsuarioServico;
import br.com.foxinline.util.Msg;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;

/**
 *
 * @author elyjunior
 */
@ViewScoped
@ManagedBean
public class ManagerCriarRevisaoAlinhamento {

    @EJB
    RevisaoAlinhamentoServico revisaoAlinhamentoServico;
    @EJB
    ImovelServico imovelServico;
    @EJB
    UsuarioServico usuarioServico;
    @EJB
    PrefeituraServico prefeituraServico;
    @EJB
    TramiteRequerimentoServico tramiteRequerimentoServico;
    @EJB
    RequerimentoServico requerimentoServico;
    
    List<HistoricoRevisaoAlinhamento> historicoRevisaoAlinhamentos;
    private RevisaoAlinhamento revisaoAlinhamento;
    private HistoricoRevisaoAlinhamento historicoRevisaoAlinhamento;
    private String imovelId;
    private Imovel imovel;
    Usuario usuario;
    Requerimento requerimento;
    private TramiteRequerimento tramite;
    private List<TramiteRequerimento> tramites;

    @PostConstruct
    public void init() {
        revisaoAlinhamento = new RevisaoAlinhamento();
        historicoRevisaoAlinhamento = new HistoricoRevisaoAlinhamento();
        historicoRevisaoAlinhamentos = new ArrayList<HistoricoRevisaoAlinhamento>();
        Map<String, String> params = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap();
        imovelId = params.get("imovelId");
        paramPost();
        usuario = usuarioServico.getCurrentUser();
        tramite = new TramiteRequerimento();
        tramites = new ArrayList<TramiteRequerimento>();
    }

    public void paramPost() {
        try {
            if (imovelId != null) {
                imovel = imovelServico.find(Long.parseLong(imovelId));
                imovel.setProprietarios(imovelServico.lstProprietario(imovel));
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void salvar() {
        try {
            revisaoAlinhamento.setImovel(imovel);
            revisaoAlinhamento.setRequerimento(salvarRequerimento());
            historicoRevisaoAlinhamento.setUsuario(usuario);
            historicoRevisaoAlinhamento.setRevisaoAlinhamento(revisaoAlinhamento);
            historicoRevisaoAlinhamento.setDataCriacao(new Date());
            historicoRevisaoAlinhamentos.add(historicoRevisaoAlinhamento);
            revisaoAlinhamento.setHistoricoRevisaoAlinhamentos(historicoRevisaoAlinhamentos);
            revisaoAlinhamento.setDatada(new Date());
            revisaoAlinhamentoServico.update(revisaoAlinhamento);

            Msg.messagemInfoRedirect(Msg.SuccessFull, "visualizarimovel.xhtml?vImovel=" + revisaoAlinhamento.getImovel().getId());
//            org.primefaces.context.RequestContext.getCurrentInstance().execute("printDialog.show();");


        } catch (Exception erro) {
            erro.printStackTrace();
        }
    }

    public Requerimento salvarRequerimento() {
        requerimento = new Requerimento();

        interessadoDocNome(imovel.getProprietarios(), requerimento);
        proprietarioDocNome(imovel.getProprietarios(), requerimento);

        requerimento.setAtivo(true);
        requerimento.setStatus(Status.DOCPENDENTE);
        requerimento.setTipoRequerimento(TipoRequerimento.REVISAO_ALINHAMENTO);

        tramite = getTramiteRequerimento();
        tramites.add(tramite);

        for (TramiteRequerimento t : tramites) {
            tramiteRequerimentoServico.save(t);
        }
        requerimento.setTramites(tramites);
        requerimentoServico.save(requerimento);
        return requerimento;
    }

    public TramiteRequerimento getTramiteRequerimento() {
        TramiteRequerimento t = new TramiteRequerimento();
        t.setDataTramite(new Date());
        t.setStatus(requerimento.getStatus());
        t.setUsuario(usuario);
        return t;
    }

    private void interessadoDocNome(List<Proprietario> proprietarios, Requerimento requerimento) {

        Proprietario p = proprietarios.get(0);

        if (p.getTipoDocumento() == TipoDocumento.CNPJ) {
            requerimento.setTipoDocumentoInteressado(TipoDocumento.CNPJ);
            requerimento.setCnpjInteressado(p.getCnpj());
            requerimento.setNomeFantasiaInteressado(p.getNomeFantasia());
            if (p.getEndereco() != null) {
                requerimento.setEnderecoInteressado(p.getEndereco().getLogradouro());
                requerimento.setBairroInteressado(p.getEndereco().getBairro());
                requerimento.setCepInteressado(p.getEndereco().getCep());
                requerimento.setNumInteressado(p.getEndereco().getNumero());
            }
        } else if (p.getTipoDocumento() == TipoDocumento.CPF) {
            requerimento.setTipoDocumentoInteressado(TipoDocumento.CPF);
            requerimento.setCpfInteressado(p.getCpf());
            requerimento.setNomeInteressado(p.getNome());
            if (p.getEndereco() != null) {
                requerimento.setEnderecoInteressado(p.getEndereco().getLogradouro());
                requerimento.setBairroInteressado(p.getEndereco().getBairro());
                requerimento.setCepInteressado(p.getEndereco().getCep());
                requerimento.setNumInteressado(p.getEndereco().getNumero());
            }
        }

        requerimento.setEnderecoImovel(imovel.getEnderecoImovel().getLogradouro());
        requerimento.setBairroImovel(imovel.getEnderecoImovel().getBairro());
        requerimento.setCepImovel(imovel.getEnderecoImovel().getCep());
        requerimento.setNumImovel(imovel.getEnderecoImovel().getNumero());
    }
      
    private void proprietarioDocNome(List<Proprietario> proprietarios, Requerimento requerimento) {

        Proprietario p = proprietarios.get(0);

        if (p.getTipoDocumento() == TipoDocumento.CNPJ) {
            requerimento.setTipoDocumentoProprietario(TipoDocumento.CNPJ);
            requerimento.setCnpjProprietario(p.getCnpj());
            requerimento.setNomeFantasiaProprietario(p.getNomeFantasia());
        } else if (p.getTipoDocumento() == TipoDocumento.CPF) {
            requerimento.setTipoDocumentoProprietario(TipoDocumento.CPF);
            requerimento.setCpfProprietario(p.getCpf());
            requerimento.setNomeProprietario(p.getNome());
        }
    }

    public void relatorioRevisaoAlinhamento() {
        HashMap parametros = new HashMap();

        parametros.putAll(prefeituraServico.parametroPrefeitura());

        revisaoAlinhamentoServico.relatorioRevisaoAlinhamento(parametros, revisaoAlinhamento);
    }

    public void redirectRevisaoAlinhamento() throws IOException {
        ExternalContext context = FacesContext.getCurrentInstance().getExternalContext();
        context.redirect("visualizarimovel.xhtml?vImovel=" + imovel.getId());
    }

    public Imovel getImovel() {
        return imovel;
    }

    public void setImovel(Imovel imovel) {
        this.imovel = imovel;
    }

    public RevisaoAlinhamento getRevisaoAlinhamento() {
        return revisaoAlinhamento;
    }

    public void setRevisaoAlinhamento(RevisaoAlinhamento revisaoAlinhamento) {
        this.revisaoAlinhamento = revisaoAlinhamento;
    }
}
